#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=1000009;
const ull B=131;
int T,n,sa[N],rk[N],pa[N*2],nE,hd[N],ans[N],cnt[N];
ull hs[N],ht[N],pw[N];
bool p[N];
char s[N];
struct Edge{int to,nxt;} e[N*2];
void addedge(int u,int v){
    e[++nE]=(Edge){v,hd[u]};
    hd[u]=nE;
}
ull calcs(int l,int r){
    return hs[r]-hs[l-1]*pw[r-l+1];
}
ull calct(int l,int r){
    return ht[l]-ht[r+1]*pw[r-l+1];
}
void solve(){
    scanf("%d",&n);
    nE=0;
    for(int i=1;i<=n;i++)
        hd[i]=cnt[i]=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&sa[i]);
        sa[i]++;
        if(sa[i]<1||sa[i]>n){
            puts("-1");
            return;
        }
        cnt[sa[i]]++;
        if(cnt[sa[i]]>=2){
            puts("-1");
            return;
        }
    }
    for(int i=1;i<=n*2-1;i++)
        scanf("%d",&pa[i]);
    for(int i=1;i<=n;i++)
        rk[sa[i]]=i;
    for(int i=1;i<=n-1;i++){
        p[i]=0;
        if(rk[sa[i]+1]>rk[sa[i+1]+1])
            p[i]=1;
    }
    for(int i=1;i<=n*2-1;i++){
        if(i%2==1){
            if(pa[i]%2==0){
                puts("-1");
                return;
            }
            int l=(i+1)/2-(pa[i]-1)/2;
            int r=(i+1)/2+(pa[i]-1)/2;
            if(l<1||r>n){
                puts("-1");
                return;
            }
            if(l==1||r==n)continue;
            if(rk[l-1]<rk[r+1])
                addedge(rk[r+1],rk[l-1]);
            else addedge(rk[l-1],rk[r+1]);
        }else{
            if(pa[i]%2==1){
                puts("-1");
                return;
            }
            if(pa[i]==0){
                if(rk[i/2]<rk[i/2+1])
                    addedge(rk[i/2+1],rk[i/2]);
                else addedge(rk[i/2],rk[i/2+1]);
                continue;
            }
            int l=i/2-pa[i]/2+1;
            int r=i/2+pa[i]/2;
            if(l<1||r>n){
                puts("-1");
                return;
            }
            if(l==1||r==n)continue;
            if(rk[l-1]<rk[r+1])
                addedge(rk[r+1],rk[l-1]);
            else addedge(rk[l-1],rk[r+1]);
        }
    }
    for(int u=1;u<=n;u++){
        if(!p[u-1])ans[u]=ans[u-1];
        else ans[u]=ans[u-1]+1;
        for(int i=hd[u];i;i=e[i].nxt){
            int v=e[i].to;
            ans[u]=max(ans[u],ans[v]+1);
        }
    }
    if(ans[n]>=26){
        puts("-1");
        return;
    }
    for(int i=1;i<=n;i++)
        s[sa[i]]='a'+ans[i];
    pw[0]=1;
    for(int i=1;i<=n;i++)
        pw[i]=pw[i-1]*B;
    for(int i=1;i<=n;i++)
        hs[i]=hs[i-1]*B+s[i];
    for(int i=n;i>=1;i--)
        ht[i]=ht[i+1]*B+s[i];
    for(int i=1;i<=n*2-1;i++){
        if(pa[i]==0)continue;
        int l,r;
        if(i%2==1){
            l=(i+1)/2-(pa[i]-1)/2;
            r=(i+1)/2+(pa[i]-1)/2;
        }else{
            l=i/2-pa[i]/2+1;
            r=i/2+pa[i]/2;
        }
        if(calcs(l,r)!=calct(l,r)){
            puts("-1");
            return;
        }
    }
    for(int i=1;i<=n;i++)
        printf("%c",s[i]);
    puts("");
}
int main(){
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    scanf("%d",&T);
    while(T--)solve();
    return 0;
}